// Copyright (C) 2015 André Bargull. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
description: B.1.4 is not applied for Unicode RegExp - ClassEscape in range expression
info: |
    The compatibility extensions defined in B.1.4 Regular Expressions Patterns
    are not applied for Unicode RegExp.
    Tested extension: "ClassAtomNoDashInRange :: \ ClassEscape but only if ClassEscape evaluates to a CharSet with exactly one character"
es6id: 21.2.2.15.1
---*/

// Leading CharacterClassEscape.
function Test() {
    assert.throws(SyntaxError, function() {
      RegExp("[\\d-a]", "u");
    }, 'RegExp("[\\d-a]", "u"): ');
    assert.throws(SyntaxError, function() {
      RegExp("[\\D-a]", "u");
    }, 'RegExp("[\\D-a]", "u"): ');
    assert.throws(SyntaxError, function() {
      RegExp("[\\s-a]", "u");
    }, 'RegExp("[\\s-a]", "u"): ');
    assert.throws(SyntaxError, function() {
      RegExp("[\\S-a]", "u");
    }, 'RegExp("[\\S-a]", "u"): ');
    assert.throws(SyntaxError, function() {
      RegExp("[\\w-a]", "u");
    }, 'RegExp("[\\w-a]", "u"): ');
    assert.throws(SyntaxError, function() {
      RegExp("[\\W-a]", "u");
    }, 'RegExp("[\\W-a]", "u"): ');


// Trailing CharacterClassEscape.
    assert.throws(SyntaxError, function() {
      RegExp("[a-\\d]", "u");
    }, 'RegExp("[a-\\d]", "u"): ');
    assert.throws(SyntaxError, function() {
      RegExp("[a-\\D]", "u");
    }, 'RegExp("[a-\\D]", "u"): ');
    assert.throws(SyntaxError, function() {
      RegExp("[a-\\s]", "u");
    }, 'RegExp("[a-\\s]", "u"): ');
    assert.throws(SyntaxError, function() {
      RegExp("[a-\\S]", "u");
    }, 'RegExp("[a-\\S]", "u"): ');
    assert.throws(SyntaxError, function() {
      RegExp("[a-\\w]", "u");
    }, 'RegExp("[a-\\w]", "u"): ');
    assert.throws(SyntaxError, function() {
      RegExp("[a-\\W]", "u");
    }, 'RegExp("[a-\\W]", "u"): ');


// Leading and trailing CharacterClassEscape.
    assert.throws(SyntaxError, function() {
      RegExp("[\\d-\\d]", "u");
    }, 'RegExp("[\\d-\\d]", "u"): ');
    assert.throws(SyntaxError, function() {
      RegExp("[\\D-\\D]", "u");
    }, 'RegExp("[\\D-\\D]", "u"): ');
    assert.throws(SyntaxError, function() {
      RegExp("[\\s-\\s]", "u");
    }, 'RegExp("[\\s-\\s]", "u"): ');
    assert.throws(SyntaxError, function() {
      RegExp("[\\S-\\S]", "u");
    }, 'RegExp("[\\S-\\S]", "u"): ');
    assert.throws(SyntaxError, function() {
      RegExp("[\\w-\\w]", "u");
    }, 'RegExp("[\\w-\\w]", "u"): ');
    assert.throws(SyntaxError, function() {
      RegExp("[\\W-\\W]", "u");
    }, 'RegExp("[\\W-\\W]", "u"): ');
}

// preheat
const NUMBER_OF_PREHEAT = 1;
for (let i = 0; i < NUMBER_OF_PREHEAT; i++) {
    Test();
}

ArkTools.jitCompileAsync(Test);
assert.sameValue(ArkTools.waitJitCompileFinish(Test), true, '[JIT] JIT disabled.');

// test
const NUMBER_OF_TEST = 1; // or 2
for (let i = 0; i < NUMBER_OF_PREHEAT; i++) {
    Test();
}
